package com.billdowney.util.microsoft.office.excel;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.billdowney.util.file.EncodingDetect;
import com.csvreader.CsvReader;

/**
 * @Description: CVS文件工具类
 * @author 超级小富翁 - BillDowney
 * @date 2018年5月18日 上午10:32:32
 */
public class ExcelCsvUtil {

	public static void main(String[] args) throws Exception {
		String filePath = "D:/desktop/provinces.csv";
		List<Map<String, String>> data = readCsvFile(filePath);
		printExcelData(data);
	}

	/**
	 * 传入文件路径并放回CVS的内容，自动识别文件编码
	 * 
	 * @param filePath 文件路径
	 * @return 读取到的内容
	 * @throws FileNotFoundException
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2019年10月14日 上午9:51:34
	 */
	public static List<Map<String, String>> readCsvFile(String filePath) throws FileNotFoundException {
		return readCsvFile(new File(filePath), EncodingDetect.getJavaEncode(filePath));
	}

	/**
	 * 传入文件路径并放回CVS的内容
	 * 
	 * @param filePath 文件路径
	 * @param charset  文件的字符集
	 * @return 读取到的内容
	 * @throws FileNotFoundException
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2019年10月14日 上午9:51:34
	 */
	public static List<Map<String, String>> readCsvFile(String filePath, String charset) throws FileNotFoundException {
		return readCsvFile(new File(filePath), charset);
	}

	/**
	 * 传入文件信息类并读取cvs的内容
	 * 
	 * @param file    包含cvs的文件类
	 * @param charset 文件的字符集
	 * @return 读取到的内容
	 * @throws FileNotFoundException
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2019年10月14日 上午9:50:50
	 */
	public static List<Map<String, String>> readCsvFile(File file, String charset) throws FileNotFoundException {
		return readCsvFile(new FileInputStream(file), charset);
	}

	/**
	 * 传入文件信息类并读取cvs的内容
	 * 
	 * @param inputStream 包含cvs的文件类的输入流
	 * @param charset     文件的字符集
	 * @return 读取到的内容
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2019年10月14日 上午9:50:09
	 */
	public static List<Map<String, String>> readCsvFile(InputStream inputStream, String charset) {
		List<Map<String, String>> data = new ArrayList<>();
		try {
			DataInputStream in = new DataInputStream(inputStream);
			BufferedReader br = new BufferedReader(new InputStreamReader(in, charset));// 这里如果csv文件编码格式是utf-8,改成utf-8即可
			// 创建CSV读对象
			CsvReader csvReader = new CsvReader(br);
			// 读表头
			csvReader.readHeaders();
			while (csvReader.readRecord()) {
				Map<String, String> rowData = new HashMap<String, String>();
				String[] headers = csvReader.getHeaders();
				for (String header : headers) {
					rowData.put(header, csvReader.get(header));
				}
				data.add(rowData);
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
		return data;
	}

	/**
	 * 传入读取到的CVS文件内容并打印
	 * 
	 * @param cvsData
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年7月16日 下午6:18:53
	 */
	public static void printExcelData(List<Map<String, String>> cvsData) {
		if (cvsData.size() > 0) {
			Set<String> headers = cvsData.get(0).keySet();
			for (String header : headers) {
				System.out.print(header + "\t");
			}
			System.out.println();
			for (Map<String, String> map : cvsData) {
				for (String header : headers) {
					System.out.print(map.get(header) + "\t");
				}
				System.out.println();
			}
		}
	}

}
